import { reactive } from 'vue'
import { eachTree, treeMap, filter } from '@/utils/tree'
import { FormSchema } from '@/components/Form'
import { TableColumn } from '@/components/Table'
import { DescriptionsSchema } from '@/components/Descriptions'
import { h } from 'vue'
import { ElTooltip, ElIcon } from 'element-plus'
import { QuestionFilled } from '@element-plus/icons-vue'
import { getFormTip } from '@/utils/tips'

export type CrudSchema = Omit<TableColumn, 'children'> & {
  search?: CrudSearchParams
  table?: CrudTableParams
  form?: CrudFormParams
  detail?: CrudDescriptionsParams
  children?: CrudSchema[]
  // 新增提示配置
  showTip?: boolean
  tipConfig?: {
    formType?: string
    customTip?: string
  }
}

interface CrudSearchParams extends Omit<FormSchema, 'field'> {
  hidden?: boolean
}

interface CrudTableParams extends Omit<TableColumn, 'field'> {
  hidden?: boolean
}

interface CrudFormParams extends Omit<FormSchema, 'field'> {
  hidden?: boolean
}

interface CrudDescriptionsParams extends Omit<DescriptionsSchema, 'field'> {
  hidden?: boolean
}

interface AllSchemas {
  searchSchema: FormSchema[]
  tableColumns: TableColumn[]
  formSchema: FormSchema[]
  detailSchema: DescriptionsSchema[]
}

// 新增选项接口
interface UseCrudSchemasOptions {
  showTips?: boolean
  defaultFormType?: string
}

/**
 * @deprecated 不推荐使用，感觉过于繁琐，不是很灵活 可能会在某个版本中删除
 */
export const useCrudSchemas = (
  crudSchema: CrudSchema[],
  options: UseCrudSchemasOptions = {} // 添加 options 参数
): {
  allSchemas: AllSchemas
} => {
  const { showTips = false, defaultFormType = 'preferredCatalog' } = options



  // 所有结构数据
  const allSchemas = reactive<AllSchemas>({
    searchSchema: [],
    tableColumns: [],
    formSchema: [],
    detailSchema: []
  })

  const searchSchema = filterSearchSchema(crudSchema)
  // @ts-ignore
  allSchemas.searchSchema = searchSchema || []

  const tableColumns = filterTableSchema(crudSchema)
  allSchemas.tableColumns = tableColumns || []

  const formSchema = filterFormSchema(crudSchema, showTips, defaultFormType) // 传递参数
  allSchemas.formSchema = formSchema

  const detailSchema = filterDescriptionsSchema(crudSchema)
  allSchemas.detailSchema = detailSchema

  return {
    allSchemas
  }
}

// 过滤 Search 结构
const filterSearchSchema = (crudSchema: CrudSchema[]): FormSchema[] => {
  const searchSchema: FormSchema[] = []
  const length = crudSchema.length

  for (let i = 0; i < length; i++) {
    const schemaItem = crudSchema[i]
    if (schemaItem.search?.hidden === true) {
      continue
    }
    const searchSchemaItem = {
      component: schemaItem?.search?.component || 'Input',
      ...schemaItem.search,
      field: schemaItem.field,
      label: schemaItem.search?.label || schemaItem.label
    }

    searchSchema.push(searchSchemaItem)
  }

  return searchSchema
}

// 过滤 table 结构
const filterTableSchema = (crudSchema: CrudSchema[]): TableColumn[] => {
  const tableColumns = treeMap<CrudSchema>(crudSchema, {
    conversion: (schema: CrudSchema) => {
      if (!schema?.table?.hidden) {
        return {
          ...schema,
          ...schema.table
        }
      }
    }
  })

  return filter<TableColumn>(tableColumns as TableColumn[], (data) => {
    if (data.children === void 0) {
      delete data.children
    }
    return !!data.field
  })
}

// 过滤 form 结构 - 支持提示功能
const filterFormSchema = (
  crudSchema: CrudSchema[],
  showTips: boolean,
  defaultFormType: string
): FormSchema[] => {

  const formSchema: FormSchema[] = []
  const length = crudSchema.length

  for (let i = 0; i < length; i++) {
    const formItem = crudSchema[i]

    // 添加 hidden 检查
    if (formItem.form?.hidden === true) {
      continue
    }

    // 处理表单配置
    const formSchemaItem: FormSchema = {
      component: formItem?.form?.component || 'Input',
      ...formItem.form,
      field: formItem.field,
      label: formItem.form?.label || formItem.label
    }

    // 如果需要显示提示，配置 label 插槽
    if (showTips && formItem.showTip) {
      const tipContent = getFormTip(
        formItem.tipConfig?.formType || defaultFormType,
        formItem.field
      ) || '暂无说明'

      // 配置 label 插槽
      formSchemaItem.formItemProps = {
        ...formSchemaItem.formItemProps,
        slots: {
          ...formSchemaItem.formItemProps?.slots,
          label: () =>
            h('span', {
              style: 'display: inline-flex; align-items: center; gap: 4px;'
            }, [
              formItem.form?.label || formItem.label,
              h(ElTooltip, {
                content: tipContent,
                placement: 'top'
              }, {
                default: () => h(ElIcon, {
                  style: 'color: #909399; cursor: help; font-size: 14px;'
                }, () => h(QuestionFilled))
              })
            ])
        }
      }
    }

    formSchema.push(formSchemaItem)
  }

  return formSchema
}

// 过滤 descriptions 结构
const filterDescriptionsSchema = (crudSchema: CrudSchema[]): DescriptionsSchema[] => {
  const descriptionsSchema: FormSchema[] = []

  eachTree(crudSchema, (schemaItem: CrudSchema) => {
    if (!schemaItem?.detail?.hidden) {
      const descriptionsSchemaItem = {
        ...schemaItem.detail,
        field: schemaItem.field,
        label: schemaItem.detail?.label || schemaItem.label
      }

      delete descriptionsSchemaItem.hidden

      descriptionsSchema.push(descriptionsSchemaItem)
    }
  })

  return descriptionsSchema
}
